home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / ast_comp / ora-sql.shr < prev    next >
Text File  |  1993-07-04  |  15KB  |  850 lines

  1. #!/bin/sh
  2. #
  3. # This is a SQL lexer and parser based on the grammar in Date's SQL
  4. # book.  For more info, see Levine, Mason, and Brown, "lex&yacc," 2nd
  5. # edition, O'Reilly and Associates, where this parser is explained in
  6. # detail in Chapter 5.
  7. #
  8. # I grant anyone permission to reproduce these files in any form.  If
  9. # you use it in a commercial product, I'd appreciate credit.
  10. #
  11. # John Levine, johnl@iecc.cambridge.ma.us, October 1992
  12. # This is a shell archive (produced by shar 3.49)
  13. # To extract the files from this archive, save it to a file, remove
  14. # everything above the "!/bin/sh" line above, and type "sh file_name".
  15. #
  16. # made 10/31/1992 03:58 UTC by johnl@iecc
  17. # Source directory /usr/johnl/nuts/lyref/code
  18. #
  19. # existing files will NOT be overwritten unless -c is specified
  20. #
  21. # This shar contains:
  22. # length  mode       name
  23. # ------ ---------- ------------------------------------------
  24. #   9260 -rw-rw-r-- sql1.y
  25. #   3533 -rw-rw-r-- scn1.l
  26. #
  27. # ============= sql1.y ==============
  28. if test -f 'sql1.y' -a X"$1" != X"-c"; then
  29.     echo 'x - skipping sql1.y (File already exists)'
  30. else
  31. echo 'x - extracting sql1.y (Text)'
  32. sed 's/^X//' << 'SHAR_EOF' > 'sql1.y' &&
  33. X    /* symbolic tokens */
  34. X
  35. %union {
  36. X    int intval;
  37. X    double floatval;
  38. X    char *strval;
  39. X    int subtok;
  40. }
  41. X    
  42. %token NAME
  43. %token STRING
  44. %token INTNUM APPROXNUM
  45. X
  46. X    /* operators */
  47. X
  48. %left OR
  49. %left AND
  50. %left NOT
  51. %left <subtok> COMPARISON /* = <> < > <= >= */
  52. %left '+' '-'
  53. %left '*' '/'
  54. %nonassoc UMINUS
  55. X
  56. X    /* literal keyword tokens */
  57. X
  58. %token ALL AMMSC ANY AS ASC AUTHORIZATION BETWEEN BY
  59. %token CHARACTER CHECK CLOSE COMMIT CONTINUE CREATE CURRENT
  60. %token CURSOR DECIMAL DECLARE DEFAULT DELETE DESC DISTINCT DOUBLE
  61. %token ESCAPE EXISTS FETCH FLOAT FOR FOREIGN FOUND FROM GOTO
  62. %token GRANT GROUP HAVING IN INDICATOR INSERT INTEGER INTO
  63. %token IS KEY LANGUAGE LIKE MODULE NULLX NUMERIC OF ON
  64. %token OPEN OPTION ORDER PRECISION PRIMARY PRIVILEGES PROCEDURE
  65. %token PUBLIC REAL REFERENCES ROLLBACK SCHEMA SELECT SET
  66. %token SMALLINT SOME SQLCODE SQLERROR TABLE TO UNION
  67. %token UNIQUE UPDATE USER VALUES VIEW WHENEVER WHERE WITH WORK
  68. %token COBOL FORTRAN PASCAL PLI C ADA
  69. X
  70. %%
  71. X
  72. sql_list:
  73. X        sql ';'
  74. X    |    sql_list sql ';'
  75. X    ;
  76. X
  77. X
  78. X    /* schema definition language */
  79. X    /* Note: other ``sql:'' rules appear later in the grammar */
  80. sql:        schema
  81. X    ;
  82. X    
  83. schema:
  84. X        CREATE SCHEMA AUTHORIZATION user opt_schema_element_list
  85. X    ;
  86. X
  87. opt_schema_element_list:
  88. X        /* empty */
  89. X    |    schema_element_list
  90. X    ;
  91. X
  92. schema_element_list:
  93. X        schema_element
  94. X    |    schema_element_list schema_element
  95. X    ;
  96. X
  97. schema_element:
  98. X        base_table_def
  99. X    |    view_def
  100. X    |    privilege_def
  101. X    ;
  102. X
  103. base_table_def:
  104. X        CREATE TABLE table '(' base_table_element_commalist ')'
  105. X    ;
  106. X
  107. base_table_element_commalist:
  108. X        base_table_element
  109. X    |    base_table_element_commalist ',' base_table_element
  110. X    ;
  111. X
  112. base_table_element:
  113. X        column_def
  114. X    |    table_constraint_def
  115. X    ;
  116. X
  117. column_def:
  118. X        column data_type column_def_opt_list
  119. X    ;
  120. X
  121. column_def_opt_list:
  122. X        /* empty */
  123. X    |    column_def_opt_list column_def_opt
  124. X    ;
  125. X
  126. column_def_opt:
  127. X        NOT NULLX
  128. X    |    NOT NULLX UNIQUE
  129. X    |    NOT NULLX PRIMARY KEY
  130. X    |    DEFAULT literal
  131. X    |    DEFAULT NULLX
  132. X    |    DEFAULT USER
  133. X    |    CHECK '(' search_condition ')'
  134. X    |    REFERENCES table
  135. X    |    REFERENCES table '(' column_commalist ')'
  136. X    ;
  137. X
  138. table_constraint_def:
  139. X        UNIQUE '(' column_commalist ')'
  140. X    |    PRIMARY KEY '(' column_commalist ')'
  141. X    |    FOREIGN KEY '(' column_commalist ')'
  142. X            REFERENCES table 
  143. X    |    FOREIGN KEY '(' column_commalist ')'
  144. X            REFERENCES table '(' column_commalist ')'
  145. X    |    CHECK '(' search_condition ')'
  146. X    ;
  147. X
  148. column_commalist:
  149. X        column
  150. X    |    column_commalist ',' column
  151. X    ;
  152. X
  153. view_def:
  154. X        CREATE VIEW table opt_column_commalist
  155. X        AS query_spec opt_with_check_option
  156. X    ;
  157. X    
  158. opt_with_check_option:
  159. X        /* empty */
  160. X    |    WITH CHECK OPTION
  161. X    ;
  162. X
  163. opt_column_commalist:
  164. X        /* empty */
  165. X    |    '(' column_commalist ')'
  166. X    ;
  167. X
  168. privilege_def:
  169. X        GRANT privileges ON table TO grantee_commalist
  170. X        opt_with_grant_option
  171. X    ;
  172. X
  173. opt_with_grant_option:
  174. X        /* empty */
  175. X    |    WITH GRANT OPTION
  176. X    ;
  177. X
  178. privileges:
  179. X        ALL PRIVILEGES
  180. X    |    ALL
  181. X    |    operation_commalist
  182. X    ;
  183. X
  184. operation_commalist:
  185. X        operation
  186. X    |    operation_commalist ',' operation
  187. X    ;
  188. X
  189. operation:
  190. X        SELECT
  191. X    |    INSERT
  192. X    |    DELETE
  193. X    |    UPDATE opt_column_commalist
  194. X    |    REFERENCES opt_column_commalist
  195. X    ;
  196. X
  197. X
  198. grantee_commalist:
  199. X        grantee
  200. X    |    grantee_commalist ',' grantee
  201. X    ;
  202. X
  203. grantee:
  204. X        PUBLIC
  205. X    |    user
  206. X    ;
  207. X
  208. X    /* module language */
  209. sql:        module_def
  210. X    ;
  211. X
  212. module_def:
  213. X        MODULE opt_module
  214. X        LANGUAGE lang
  215. X        AUTHORIZATION user
  216. X        opt_cursor_def_list
  217. X        procedure_def_list
  218. X    ;
  219. X
  220. opt_module:
  221. X        /* empty */
  222. X    |    module
  223. X    ;
  224. X
  225. lang:
  226. X        COBOL
  227. X    |    FORTRAN
  228. X    |    PASCAL
  229. X    |    PLI
  230. X    |    C
  231. X    |    ADA
  232. X    ;
  233. X
  234. opt_cursor_def_list:
  235. X        /* empty */
  236. X    |    cursor_def_list
  237. X    ;
  238. X
  239. cursor_def_list:
  240. X        cursor_def
  241. X    |    cursor_def_list cursor_def
  242. X    ;
  243. X
  244. cursor_def:
  245. X        DECLARE cursor CURSOR FOR query_exp opt_order_by_clause
  246. X    ;
  247. X
  248. opt_order_by_clause:
  249. X        /* empty */
  250. X    |    ORDER BY ordering_spec_commalist
  251. X    ;
  252. X
  253. ordering_spec_commalist:
  254. X        ordering_spec
  255. X    |    ordering_spec_commalist ',' ordering_spec
  256. X    ;
  257. X
  258. ordering_spec:
  259. X        INTNUM opt_asc_desc
  260. X    |    column_ref opt_asc_desc
  261. X    ;
  262. X
  263. opt_asc_desc:
  264. X        /* empty */
  265. X    |    ASC
  266. X    |    DESC
  267. X    ;
  268. X
  269. procedure_def_list:
  270. X        procedure_def
  271. X    |    procedure_def_list procedure_def
  272. X    ;
  273. X
  274. procedure_def:
  275. X        PROCEDURE procedure parameter_def_list ';'
  276. X        manipulative_statement_list
  277. X    ;
  278. X
  279. manipulative_statement_list:
  280. X        manipulative_statement
  281. X    |    manipulative_statement_list manipulative_statement
  282. X    ;
  283. X
  284. parameter_def_list:
  285. X        parameter_def
  286. X    |    parameter_def_list parameter_def
  287. X    ;
  288. X
  289. parameter_def:
  290. X        parameter data_type
  291. X    |    SQLCODE
  292. X    ;
  293. X
  294. X    /* manipulative statements */
  295. X
  296. sql:        manipulative_statement
  297. X    ;
  298. X
  299. manipulative_statement:
  300. X        close_statement
  301. X    |    commit_statement
  302. X    |    delete_statement_positioned
  303. X    |    delete_statement_searched
  304. X    |    fetch_statement
  305. X    |    insert_statement
  306. X    |    open_statement
  307. X    |    rollback_statement
  308. X    |    select_statement
  309. X    |    update_statement_positioned
  310. X    |    update_statement_searched
  311. X    ;
  312. X
  313. close_statement:
  314. X        CLOSE cursor
  315. X    ;
  316. X
  317. commit_statement:
  318. X        COMMIT WORK
  319. X    ;
  320. X
  321. delete_statement_positioned:
  322. X        DELETE FROM table WHERE CURRENT OF cursor
  323. X    ;
  324. X
  325. delete_statement_searched:
  326. X        DELETE FROM table opt_where_clause
  327. X    ;
  328. X
  329. fetch_statement:
  330. X        FETCH cursor INTO target_commalist
  331. X    ;
  332. X
  333. insert_statement:
  334. X        INSERT INTO table opt_column_commalist values_or_query_spec
  335. X    ;
  336. X
  337. values_or_query_spec:
  338. X        VALUES '(' insert_atom_commalist ')'
  339. X    |    query_spec
  340. X    ;
  341. X
  342. insert_atom_commalist:
  343. X        insert_atom
  344. X    |    insert_atom_commalist ',' insert_atom
  345. X    ;
  346. X
  347. insert_atom:
  348. X        atom
  349. X    |    NULLX
  350. X    ;
  351. X
  352. open_statement:
  353. X        OPEN cursor
  354. X    ;
  355. X
  356. rollback_statement:
  357. X        ROLLBACK WORK
  358. X    ;
  359. X
  360. select_statement:
  361. X        SELECT opt_all_distinct selection
  362. X        INTO target_commalist
  363. X        table_exp
  364. X    ;
  365. X
  366. opt_all_distinct:
  367. X        /* empty */
  368. X    |    ALL
  369. X    |    DISTINCT
  370. X    ;
  371. X
  372. update_statement_positioned:
  373. X        UPDATE table SET assignment_commalist
  374. X        WHERE CURRENT OF cursor
  375. X    ;
  376. X
  377. assignment_commalist:
  378. X    |    assignment
  379. X    |    assignment_commalist ',' assignment
  380. X    ;
  381. X
  382. assignment:
  383. X        column '=' scalar_exp
  384. X    |    column '=' NULLX
  385. X    ;
  386. X
  387. update_statement_searched:
  388. X        UPDATE table SET assignment_commalist opt_where_clause
  389. X    ;
  390. X
  391. target_commalist:
  392. X        target
  393. X    |    target_commalist ',' target
  394. X    ;
  395. X
  396. target:
  397. X        parameter_ref
  398. X    ;
  399. X
  400. opt_where_clause:
  401. X        /* empty */
  402. X    |    where_clause
  403. X    ;
  404. X
  405. X    /* query expressions */
  406. X
  407. query_exp:
  408. X        query_term
  409. X    |    query_exp UNION query_term
  410. X    |    query_exp UNION ALL query_term
  411. X    ;
  412. X
  413. query_term:
  414. X        query_spec
  415. X    |    '(' query_exp ')'
  416. X    ;
  417. X
  418. query_spec:
  419. X        SELECT opt_all_distinct selection table_exp
  420. X    ;
  421. X
  422. selection:
  423. X        scalar_exp_commalist
  424. X    |    '*'
  425. X    ;
  426. X
  427. table_exp:
  428. X        from_clause
  429. X        opt_where_clause
  430. X        opt_group_by_clause
  431. X        opt_having_clause
  432. X    ;
  433. X
  434. from_clause:
  435. X        FROM table_ref_commalist
  436. X    ;
  437. X
  438. table_ref_commalist:
  439. X        table_ref
  440. X    |    table_ref_commalist ',' table_ref
  441. X    ;
  442. X
  443. table_ref:
  444. X        table 
  445. X    |    table range_variable
  446. X    ;
  447. X
  448. where_clause:
  449. X        WHERE search_condition
  450. X    ;
  451. X
  452. opt_group_by_clause:
  453. X        /* empty */
  454. X    |    GROUP BY column_ref_commalist
  455. X    ;
  456. X
  457. column_ref_commalist:
  458. X        column_ref
  459. X    |    column_ref_commalist ',' column_ref
  460. X    ;
  461. X
  462. opt_having_clause:
  463. X        /* empty */
  464. X    |    HAVING search_condition
  465. X    ;
  466. X
  467. X    /* search conditions */
  468. X
  469. search_condition:
  470. X    |    search_condition OR search_condition
  471. X    |    search_condition AND search_condition
  472. X    |    NOT search_condition
  473. X    |    '(' search_condition ')'
  474. X    |    predicate
  475. X    ;
  476. X
  477. predicate:
  478. X        comparison_predicate
  479. X    |    between_predicate
  480. X    |    like_predicate
  481. X    |    test_for_null
  482. X    |    in_predicate
  483. X    |    all_or_any_predicate
  484. X    |    existence_test
  485. X    ;
  486. X
  487. comparison_predicate:
  488. X        scalar_exp COMPARISON scalar_exp
  489. X    |    scalar_exp COMPARISON subquery
  490. X    ;
  491. X
  492. between_predicate:
  493. X        scalar_exp NOT BETWEEN scalar_exp AND scalar_exp
  494. X    |    scalar_exp BETWEEN scalar_exp AND scalar_exp
  495. X    ;
  496. X
  497. like_predicate:
  498. X        scalar_exp NOT LIKE atom opt_escape
  499. X    |    scalar_exp LIKE atom opt_escape
  500. X    ;
  501. X
  502. opt_escape:
  503. X        /* empty */
  504. X    |    ESCAPE atom
  505. X    ;
  506. X
  507. test_for_null:
  508. X        column_ref IS NOT NULLX
  509. X    |    column_ref IS NULLX
  510. X    ;
  511. X
  512. in_predicate:
  513. X        scalar_exp NOT IN '(' subquery ')'
  514. X    |    scalar_exp IN '(' subquery ')'
  515. X    |    scalar_exp NOT IN '(' atom_commalist ')'
  516. X    |    scalar_exp IN '(' atom_commalist ')'
  517. X    ;
  518. X
  519. atom_commalist:
  520. X        atom
  521. X    |    atom_commalist ',' atom
  522. X    ;
  523. X
  524. all_or_any_predicate:
  525. X        scalar_exp COMPARISON any_all_some subquery
  526. X    ;
  527. X            
  528. any_all_some:
  529. X        ANY
  530. X    |    ALL
  531. X    |    SOME
  532. X    ;
  533. X
  534. existence_test:
  535. X        EXISTS subquery
  536. X    ;
  537. X
  538. subquery:
  539. X        '(' SELECT opt_all_distinct selection table_exp ')'
  540. X    ;
  541. X
  542. X    /* scalar expressions */
  543. X
  544. scalar_exp:
  545. X        scalar_exp '+' scalar_exp
  546. X    |    scalar_exp '-' scalar_exp
  547. X    |    scalar_exp '*' scalar_exp
  548. X    |    scalar_exp '/' scalar_exp
  549. X    |    '+' scalar_exp %prec UMINUS
  550. X    |    '-' scalar_exp %prec UMINUS
  551. X    |    atom
  552. X    |    column_ref
  553. X    |    function_ref
  554. X    |    '(' scalar_exp ')'
  555. X    ;
  556. X
  557. scalar_exp_commalist:
  558. X        scalar_exp
  559. X    |    scalar_exp_commalist ',' scalar_exp
  560. X    ;
  561. X
  562. atom:
  563. X        parameter_ref
  564. X    |    literal
  565. X    |    USER
  566. X    ;
  567. X
  568. parameter_ref:
  569. X        parameter
  570. X    |    parameter parameter
  571. X    |    parameter INDICATOR parameter
  572. X    ;
  573. X
  574. function_ref:
  575. X        AMMSC '(' '*' ')'
  576. X    |    AMMSC '(' DISTINCT column_ref ')'
  577. X    |    AMMSC '(' ALL scalar_exp ')'
  578. X    |    AMMSC '(' scalar_exp ')'
  579. X    ;
  580. X
  581. literal:
  582. X        STRING
  583. X    |    INTNUM
  584. X    |    APPROXNUM
  585. X    ;
  586. X
  587. X    /* miscellaneous */
  588. X
  589. table:
  590. X        NAME
  591. X    |    NAME '.' NAME
  592. X    ;
  593. X
  594. column_ref:
  595. X        NAME
  596. X    |    NAME '.' NAME    /* needs semantics */
  597. X    |    NAME '.' NAME '.' NAME
  598. X    ;
  599. X
  600. X        /* data types */
  601. X
  602. data_type:
  603. X        CHARACTER
  604. X    |    CHARACTER '(' INTNUM ')'
  605. X    |    NUMERIC
  606. X    |    NUMERIC '(' INTNUM ')'
  607. X    |    NUMERIC '(' INTNUM ',' INTNUM ')'
  608. X    |    DECIMAL
  609. X    |    DECIMAL '(' INTNUM ')'
  610. X    |    DECIMAL '(' INTNUM ',' INTNUM ')'
  611. X    |    INTEGER
  612. X    |    SMALLINT
  613. X    |    FLOAT
  614. X    |    FLOAT '(' INTNUM ')'
  615. X    |    REAL
  616. X    |    DOUBLE PRECISION
  617. X    ;
  618. X
  619. X    /* the various things you can name */
  620. X
  621. column:        NAME
  622. X    ;
  623. X
  624. cursor:        NAME
  625. X    ;
  626. X
  627. module:        NAME
  628. X    ;
  629. X
  630. parameter:
  631. X        ':' NAME
  632. X    ;
  633. X
  634. procedure:    NAME
  635. X    ;
  636. X
  637. range_variable:    NAME
  638. X    ;
  639. X
  640. user:        NAME
  641. X    ;
  642. X
  643. X    /* embedded condition things */
  644. sql:        WHENEVER NOT FOUND when_action
  645. X    |    WHENEVER SQLERROR when_action
  646. X    ;
  647. X
  648. when_action:    GOTO NAME
  649. X    |    CONTINUE
  650. X    ;
  651. %%
  652. SHAR_EOF
  653. chmod 0664 sql1.y ||
  654. echo 'restore of sql1.y failed'
  655. Wc_c="`wc -c < 'sql1.y'`"
  656. test 9260 -eq "$Wc_c" ||
  657.     echo 'sql1.y: original size 9260, current size' "$Wc_c"
  658. fi
  659. # ============= scn1.l ==============
  660. if test -f 'scn1.l' -a X"$1" != X"-c"; then
  661.     echo 'x - skipping scn1.l (File already exists)'
  662. else
  663. echo 'x - extracting scn1.l (Text)'
  664. sed 's/^X//' << 'SHAR_EOF' > 'scn1.l' &&
  665. %{
  666. /*
  667. X * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
  668. X * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
  669. X */
  670. X
  671. #include "sql1.h"
  672. #include <string.h>
  673. X
  674. int lineno = 1;
  675. void yyerror(char *s);
  676. %}
  677. X    /* MKS needs the next line to increase the NFA table */
  678. %e 1200
  679. X
  680. %%
  681. X
  682. X    /* literal keyword tokens */
  683. X
  684. ADA        { return ADA; }
  685. ALL        { return ALL; }
  686. AND        { return AND; }
  687. AVG        { return AMMSC; }
  688. MIN        { return AMMSC; }
  689. MAX        { return AMMSC; }
  690. SUM        { return AMMSC; }
  691. COUNT        { return AMMSC; }
  692. ANY        { return ANY; }
  693. AS        { return AS; }
  694. ASC        { return ASC; }
  695. AUTHORIZATION    { return AUTHORIZATION; }
  696. BETWEEN        { return BETWEEN; }
  697. BY        { return BY; }
  698. C        { return C; }
  699. CHAR(ACTER)?    { return CHARACTER; }
  700. CHECK        { return CHECK; }
  701. CLOSE        { return CLOSE; }
  702. COBOL        { return COBOL; }
  703. COMMIT        { return COMMIT; }
  704. CONTINUE    { return CONTINUE; }
  705. CREATE        { return CREATE; }
  706. CURRENT        { return CURRENT; }
  707. CURSOR        { return CURSOR; }
  708. DECIMAL        { return DECIMAL; }
  709. DECLARE        { return DECLARE; }
  710. DEFAULT        { return DEFAULT; }
  711. DELETE        { return DELETE; }
  712. DESC        { return DESC; }
  713. DISTINCT    { return DISTINCT; }
  714. DOUBLE        { return DOUBLE; }
  715. ESCAPE        { return ESCAPE; }
  716. EXISTS        { return EXISTS; }
  717. FETCH        { return FETCH; }
  718. FLOAT        { return FLOAT; }
  719. FOR        { return FOR; }
  720. FOREIGN        { return FOREIGN; }
  721. FORTRAN        { return FORTRAN; }
  722. FOUND        { return FOUND; }
  723. FROM        { return FROM; }
  724. GO[ \t]*TO    { return GOTO; }
  725. GRANT        { return GRANT; }
  726. GROUP        { return GROUP; }
  727. HAVING        { return HAVING; }
  728. IN        { return IN; }
  729. INDICATOR    { return INDICATOR; }
  730. INSERT        { return INSERT; }
  731. INT(EGER)?    { return INTEGER; }
  732. INTO        { return INTO; }
  733. IS        { return IS; }
  734. KEY        { return KEY; }
  735. LANGUAGE    { return LANGUAGE; }
  736. LIKE        { return LIKE; }
  737. MODULE        { return MODULE; }
  738. NOT        { return NOT; }
  739. NULL        { return NULLX; }
  740. NUMERIC        { return NUMERIC; }
  741. OF        { return OF; }
  742. ON        { return ON; }
  743. OPEN        { return OPEN; }
  744. OPTION        { return OPTION; }
  745. OR        { return OR; }
  746. ORDER        { return ORDER; }
  747. PASCAL        { return PASCAL; }
  748. PLI        { return PLI; }
  749. PRECISION    { return PRECISION; }
  750. PRIMARY        { return PRIMARY; }
  751. PRIVILEGES    { return PRIVILEGES; }
  752. PROCEDURE    { return PROCEDURE; }
  753. PUBLIC        { return PUBLIC; }
  754. REAL        { return REAL; }
  755. REFERENCES    { return REFERENCES; }
  756. ROLLBACK    { return ROLLBACK; }
  757. SCHEMA        { return SCHEMA; }
  758. SELECT        { return SELECT; }
  759. SET        { return SET; }
  760. SMALLINT    { return SMALLINT; }
  761. SOME        { return SOME; }
  762. SQLCODE        { return SQLCODE; }
  763. TABLE        { return TABLE; }
  764. TO        { return TO; }
  765. UNION        { return UNION; }
  766. UNIQUE        { return UNIQUE; }
  767. UPDATE        { return UPDATE; }
  768. USER        { return USER; }
  769. VALUES        { return VALUES; }
  770. VIEW        { return VIEW; }
  771. WHENEVER    { return WHENEVER; }
  772. WHERE        { return WHERE; }
  773. WITH        { return WITH; }
  774. WORK        { return WORK; }
  775. X
  776. X    /* punctuation */
  777. X
  778. "="    |
  779. "<>"     |
  780. "<"    |
  781. ">"    |
  782. "<="    |
  783. ">="        { return COMPARISON; }
  784. X
  785. [-+*/:(),.;]    { return yytext[0]; }
  786. X
  787. X    /* names */
  788. X
  789. [A-Za-z][A-Za-z0-9_]*    { return NAME; }
  790. X
  791. X    /* numbers */
  792. X
  793. [0-9]+    |
  794. [0-9]+"."[0-9]* |
  795. "."[0-9]*    { return INTNUM; }
  796. X
  797. [0-9]+[eE][+-]?[0-9]+    |
  798. [0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
  799. "."[0-9]*[eE][+-]?[0-9]+    { return APPROXNUM; }
  800. X
  801. X    /* strings */
  802. X
  803. '[^'\n]*'    {
  804. X        int c = input();
  805. X
  806. X        unput(c);    /* just peeking */
  807. X        if(c != '\'') {
  808. X            return STRING;
  809. X        } else
  810. X            yymore();
  811. X    }
  812. X        
  813. '[^'\n]*$    { yyerror("Unterminated string"); }
  814. X
  815. \n        lineno++;
  816. X
  817. [ \t\r]+    ;    /* white space */
  818. X
  819. "--".*$        ;    /* comment */
  820. X
  821. %%
  822. X
  823. void
  824. yyerror(char *s)
  825. {
  826. X    printf("%d: %s at %s\n", lineno, s, yytext);
  827. }
  828. X
  829. main(int ac, char **av)
  830. {
  831. X    if(ac > 1 && (yyin = fopen(av[1], "r")) == NULL) {
  832. X        perror(av[1]);
  833. X        exit(1);
  834. X    }
  835. X
  836. X    if(!yyparse())
  837. X        printf("SQL parse worked\n");
  838. X    else
  839. X        printf("SQL parse failed\n");
  840. } /* main */
  841. SHAR_EOF
  842. chmod 0664 scn1.l ||
  843. echo 'restore of scn1.l failed'
  844. Wc_c="`wc -c < 'scn1.l'`"
  845. test 3533 -eq "$Wc_c" ||
  846.     echo 'scn1.l: original size 3533, current size' "$Wc_c"
  847. fi
  848. exit 0
  849.